import threading
# 从数据库提取数据的类
class Scheduler():
    def __init__(self):
        self._lock = threading.RLock()
        self.start = 0
        # 每次取10000条数据
        self.step = 10000

    def getdata(self):
        # 上锁，以免多线程同时对数据库进行访问，取出重复数据
        self._lock.acquire()
        # 进行取数据操作
        data = 'select * from table' \
               'where id between self.start and self.start + self.step'
        # 取完数据后，指针后移
        self.start += self.step
        self._lock.release()
        return data

# 处理数据的过程写在这里
def processdata():
    # 从该实例中提取数据
    data = scheduler.getdata()
    while data:
        # 进行处理数据的具体操作:
        # 去重、补缺、运算...只要还有数据，本线程就继续取新数据
        # 然后再获取数据，进行循环
        data = scheduler.getdata()

# 创建多线程，threads_num为创建的线程数
def threads_scheduler(threads_num):
    threads = []
    for i in range(threads_num):
        # 创建线程
        td = threading.Thread(target=processdata, name='th'+str(i+1))
        threads.append(td)
    for t in threads:
        # 启动线程
        t.start()
        for t in threads:
            # 子线程守护
            t.join()
            print('数据已全部处理成功')

if __name__=='__main__':
    # 实例化一个调度器，初始化参数
    scheduler = Scheduler()
    # 创建线程，开始处理数据
    threads_scheduler(4)

